package dominio;

import interfaces.Archivo;
import interfaces.BaseDeDatos;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import utilidades.AppendingObjectOutputStream;

public class Cliente extends Usuario implements Serializable, Archivo, BaseDeDatos {
	protected Integer idCliente;
	protected String telefono;
	private static final long serialVersionUID = 1418818114405860734L;
	
	public Cliente(){	
	}
	
	public Cliente(Integer idCliente, String nombre, String apellido,
			Integer dni, String nombreUsuario, String password,
			String telefono, String email, Direccion direccion) {
		this.idCliente = idCliente;
		this.nombre = nombre;
		this.apellido = apellido;
		this.dni = dni;
		this.nombreUsuario = nombreUsuario;
		this.password = password;
		this.telefono = telefono;
		this.email = email;
		this.direccion = direccion;
	}
	
	public Integer getIdCliente() {
		return idCliente;
	}
	public void setIdCliente(Integer idCliente) {
		this.idCliente = idCliente;
	}
	public String getTelefono() {
		return telefono;
	}
	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}
	
// #####################################################################################
// ###### ARCHIVO ######################################################################
// #####################################################################################
	@Override
	public void guardarRegistro() throws IOException {
		File archivo = new File("bin/aplicacion/archivos/clientes.txt");
		ObjectOutputStream oos = null;
		if (archivo.exists()) { oos = new AppendingObjectOutputStream(
										new BufferedOutputStream(
											new FileOutputStream(archivo,true)));
		} else { oos = new ObjectOutputStream(
							new BufferedOutputStream(
								new FileOutputStream(archivo,true)));
		}	
		oos.writeObject(this);	
		oos.close();	
	}

	@Override
	public List<Cliente> leerRegistros() throws IOException {
		List<Cliente> lista = new ArrayList<Cliente>();
		File file = new File("bin/aplicacion/archivos/clientes.txt");
		ObjectInputStream ois = null;
		if (file.exists()){
			ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(file)));
			try {
				while(true){
					lista.add((Cliente) ois.readObject());
				}
			} catch(EOFException e){		
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}		
		}
		if(ois != null) ois.close();
		return lista;
	}
	
	@Override
	public int codigoUltimoRegistro() throws IOException, ClassNotFoundException {
		File file = new File("bin/aplicacion/archivos/clientes.txt");
		ObjectInputStream ois = null;
		Cliente c = null;
		if(file.exists()) {
			ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(file)));
			try {
				while(true){
					 c = (Cliente) ois.readObject();
				}
			} catch (IOException e) {
			}
			
			if(ois != null)	ois.close();
			return c.getIdCliente() + 1;
		} else {
			return 1;
		}	
	}
	
// #####################################################################################
// ###### BASE DE DATOS ################################################################
// #####################################################################################	
	@Override
	public List<Cliente> leerRegistrosBD() throws SQLException {
		List<Cliente> lista = new ArrayList<Cliente>();	
		Connection conn = null;
		String query = "select * from clientes join "
				+ "direcciones_cliente on iddireccion_d = iddireccion_c";
		DriverManager.registerDriver(new com.mysql.jdbc.Driver());
		conn = DriverManager.getConnection(host + dbName, user, pass);
		Statement st = conn.createStatement();			
		ResultSet rs = st.executeQuery(query);
		while(rs.next()){
				lista.add(new Cliente(rs.getInt("idcliente_c"), rs.getString("nombre_c"),
						rs.getString("apellido_c"), rs.getInt("dni_c"), rs.getString("usuario_c"),
						rs.getString("password_c"), rs.getString("telefono_c"), rs.getString("email_c"),
						new Direccion(rs.getString("calle_d"), rs.getInt("numero_d"),rs.getString("ciudad_d"),
						rs.getString("provincia_d"), rs.getString("pais_d"),rs.getInt("codigopostal_d")))
						);
		}
		if(conn != null)conn.close();
		return lista;
	}
	@Override
	public void guardarRegistroBd() throws SQLException {
		Connection conn = null;
		conn = DriverManager.getConnection(host + dbName, user, pass);
		Statement st = conn.createStatement();		
		String query = "INSERT INTO direcciones_cliente(calle_d,numero_d,ciudad_d,"
					+ "provincia_d,pais_d,codigopostal_d) "+ "VALUES (" + "'"
					+ this.getObjetoDireccion().getCalle() + "',"
					+ this.getObjetoDireccion().getNumero() + ",'"
					+ this.getObjetoDireccion().getCiudad() + "','"
					+ this.getObjetoDireccion().getProvincia() + "','"
					+ this.getObjetoDireccion().getPais() + "',"
					+ this.getObjetoDireccion().getCodPostal()
					+ ");";
		st.executeUpdate(query);
		ResultSet rs = st.executeQuery("Select * FROM direcciones_cliente order by "
					+ "iddireccion_d desc limit 1");
		rs.next();
		Integer iddireccion = rs.getInt("iddireccion_d");
			
		query = "INSERT INTO clientes(nombre_c,apellido_c,dni_c,"
					+ "usuario_c,password_c,telefono_c,email_c,iddireccion_c) " 
					+ "VALUES ('"
					+ this.getNombre() + "','"
					+ this.getApellido() + "',"
					+ this.getDni() + ",'"
					+ this.getNombreUsuario() + "','"
					+ this.getPassword() + "','"
					+ this.getTelefono() + "','"
					+ this.getEmail() + "',"
					+ iddireccion
					+ ");";
		st.executeUpdate(query);	
		if(conn != null)conn.close();
	}

	@Override
	public Cliente leerRegistroBD(int id) throws SQLException {
		Connection conn = null;
		Cliente c = null;
		String query = "select * from clientes join "
				+ "direcciones_cliente on iddireccion_d = iddireccion_c "
				+ "where idcliente_c =" + id + ";";
		DriverManager.registerDriver(new com.mysql.jdbc.Driver());
		conn = DriverManager.getConnection(host + dbName, user, pass);
		Statement st = conn.createStatement();			
		ResultSet rs = st.executeQuery(query);
		while(rs.next()){
				c = new Cliente(rs.getInt("idcliente_c"), rs.getString("nombre_c"),
						rs.getString("apellido_c"), rs.getInt("dni_c"), rs.getString("usuario_c"),
						rs.getString("password_c"), rs.getString("telefono_c"), rs.getString("email_c"),
						new Direccion(rs.getString("calle_d"), rs.getInt("numero_d"),rs.getString("ciudad_d"),
						rs.getString("provincia_d"), rs.getString("pais_d"),rs.getInt("codigopostal_d")))
						;
		}
		if(conn != null)conn.close();
		return c;
	}

	@Override
	public void actualizarRegistroBd() throws SQLException {
		// TODO Auto-generated method stub
		
	}

}
